/*!
    \file    dmx512_led_controller.h
    \brief   DMX512 LED控制器头文件 - 集成DMX512接收器与LED灯带控制

    \version 2025-01-20, V1.0.0, DMX512 LED控制器 for GD32C231C
*/

#ifndef DMX512_LED_CONTROLLER_H
#define DMX512_LED_CONTROLLER_H

#include "gd32c2x1.h"
#include "dmx512.h"
#include "dmx512_receiver.h"
#include "ws2812.h"
#include <stdint.h>
#include <stdbool.h>

/* DMX512 LED控制器配置 */
#define DMX512_LED_MAX_LEDS         30          /* 最大LED数量 */
#define DMX512_LED_CHANNELS_PER_LED 3           /* 每个LED的通道数(RGB) */
#define DMX512_LED_MAX_CHANNELS     (DMX512_LED_MAX_LEDS * DMX512_LED_CHANNELS_PER_LED)

/* DMX512通道映射配置 */
#define DMX512_LED_START_CHANNEL    1           /* DMX512起始通道(1-512) */
#define DMX512_LED_DMX_OUTPUT_LEDS  10          /* DMX512输出LED数量 */
#define DMX512_LED_WS2812_LEDS      30          /* WS2812 LED数量 */

/* LED控制模式枚举 */
typedef enum {
    DMX512_LED_MODE_DIRECT = 0,     /* 直接模式：DMX数据直接映射到LED */
    DMX512_LED_MODE_SCALED,         /* 缩放模式：DMX数据缩放后映射到LED */
    DMX512_LED_MODE_REPLICATED,     /* 复制模式：DMX数据复制到多个LED */
    DMX512_LED_MODE_MIXED           /* 混合模式：不同LED使用不同映射方式 */
} dmx512_led_mode_t;

/* LED输出类型枚举 */
typedef enum {
    DMX512_LED_OUTPUT_NONE = 0,     /* 不输出 */
    DMX512_LED_OUTPUT_DMX512 = 1,   /* 输出到DMX512灯带 */
    DMX512_LED_OUTPUT_WS2812 = 2,   /* 输出到WS2812灯带 */
    DMX512_LED_OUTPUT_BOTH = 3      /* 同时输出到两种灯带 */
} dmx512_led_output_t;

/* DMX512 LED控制器统计信息 */
typedef struct {
    uint32_t frames_processed;      /* 处理的帧数 */
    uint32_t frames_updated;        /* 更新LED的帧数 */
    uint32_t last_update_time;      /* 最后更新时间 */
    uint16_t active_channels;       /* 活跃通道数 */
    uint8_t update_rate;            /* 更新频率(Hz) */
} dmx512_led_stats_t;

/* DMX512 LED控制器配置结构体 */
typedef struct {
    dmx512_led_mode_t mode;         /* 控制模式 */
    dmx512_led_output_t output;     /* 输出类型 */
    uint16_t start_channel;         /* DMX512起始通道 */
    uint16_t channel_count;         /* 使用的通道数 */
    uint16_t dmx_led_count;         /* DMX512 LED数量 */
    uint16_t ws2812_led_count;      /* WS2812 LED数量 */
    uint8_t brightness;             /* 全局亮度(0-255) */
    bool auto_update;               /* 自动更新标志 */
    uint32_t update_interval_ms;    /* 更新间隔(毫秒) */
} dmx512_led_config_t;

/* DMX512 LED控制器句柄结构体 */
typedef struct {
    dmx512_led_config_t config;     /* 配置信息 */
    dmx512_led_stats_t stats;       /* 统计信息 */
    rgb_color_t led_colors[DMX512_LED_MAX_LEDS]; /* LED颜色缓冲区 */
    bool initialized;               /* 初始化标志 */
    bool enabled;                   /* 使能标志 */
    uint32_t last_frame_time;       /* 最后帧时间 */
    
    /* 回调函数指针 */
    void (*frame_update_callback)(uint16_t led_count, rgb_color_t *colors);  /* 帧更新回调 */
    void (*error_callback)(const char *error_msg);                          /* 错误回调 */
} dmx512_led_handle_t;

/* 全局DMX512 LED控制器句柄 */
extern dmx512_led_handle_t g_dmx512_led_controller;

/* DMX512 LED控制器函数声明 */

/*!
    \brief      初始化DMX512 LED控制器
    \param[in]  config: 配置参数指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_init(dmx512_led_config_t *config);

/*!
    \brief      反初始化DMX512 LED控制器
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_deinit(void);

/*!
    \brief      启动DMX512 LED控制器
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_start(void);

/*!
    \brief      停止DMX512 LED控制器
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_stop(void);

/*!
    \brief      处理接收到的DMX512帧
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_process_frame(void);

/*!
    \brief      更新LED输出
    \param[in]  force_update: 强制更新标志
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_update_leds(bool force_update);

/*!
    \brief      设置控制模式
    \param[in]  mode: 控制模式
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_mode(dmx512_led_mode_t mode);

/*!
    \brief      设置输出类型
    \param[in]  output: 输出类型
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_output(dmx512_led_output_t output);

/*!
    \brief      设置全局亮度
    \param[in]  brightness: 亮度值(0-255)
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_brightness(uint8_t brightness);

/*!
    \brief      设置起始通道
    \param[in]  start_channel: 起始通道(1-512)
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_start_channel(uint16_t start_channel);

/*!
    \brief      启用/禁用控制器
    \param[in]  enabled: 使能标志
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_enable(bool enabled);

/*!
    \brief      获取控制器状态
    \param[in]  none
    \param[out] none
    \retval     true: 已启用, false: 已禁用
*/
bool dmx512_led_controller_is_enabled(void);

/*!
    \brief      获取统计信息
    \param[out] stats: 统计信息结构体指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_get_stats(dmx512_led_stats_t *stats);

/*!
    \brief      重置统计信息
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_reset_stats(void);

/*!
    \brief      设置帧更新回调函数
    \param[in]  callback: 回调函数指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_frame_callback(void (*callback)(uint16_t led_count, rgb_color_t *colors));

/*!
    \brief      设置错误回调函数
    \param[in]  callback: 回调函数指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_error_callback(void (*callback)(const char *error_msg));

/* 高级功能函数 */

/*!
    \brief      映射DMX512数据到LED颜色
    \param[in]  dmx_data: DMX512数据缓冲区
    \param[in]  dmx_length: DMX512数据长度
    \param[out] led_colors: LED颜色输出缓冲区
    \param[in]  led_count: LED数量
    \param[out] none
    \retval     实际映射的LED数量
*/
uint16_t dmx512_led_controller_map_data(uint8_t *dmx_data, uint16_t dmx_length, 
                                       rgb_color_t *led_colors, uint16_t led_count);

/*!
    \brief      应用亮度调整
    \param[in,out] colors: LED颜色数组
    \param[in]  count: LED数量
    \param[in]  brightness: 亮度值(0-255)
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_apply_brightness(rgb_color_t *colors, uint16_t count, uint8_t brightness);

/*!
    \brief      检查DMX512数据是否有变化
    \param[in]  none
    \param[out] none
    \retval     true: 有变化, false: 无变化
*/
bool dmx512_led_controller_data_changed(void);

/*!
    \brief      获取当前LED颜色
    \param[in]  led_index: LED索引(0-29)
    \param[out] none
    \retval     LED颜色值
*/
rgb_color_t dmx512_led_controller_get_led_color(uint16_t led_index);

/*!
    \brief      设置单个LED颜色(用于测试)
    \param[in]  led_index: LED索引(0-29)
    \param[in]  color: LED颜色值
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_set_led_color(uint16_t led_index, rgb_color_t color);

/*!
    \brief      获取模式描述字符串
    \param[in]  mode: 控制模式
    \param[out] none
    \retval     模式描述字符串
*/
const char* dmx512_led_controller_get_mode_string(dmx512_led_mode_t mode);

/*!
    \brief      获取输出类型描述字符串
    \param[in]  output: 输出类型
    \param[out] none
    \retval     输出类型描述字符串
*/
const char* dmx512_led_controller_get_output_string(dmx512_led_output_t output);

/* 预定义配置 */

/*!
    \brief      获取默认配置
    \param[out] config: 配置结构体指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_get_default_config(dmx512_led_config_t *config);

/*!
    \brief      获取直接映射配置
    \param[out] config: 配置结构体指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_get_direct_config(dmx512_led_config_t *config);

/*!
    \brief      获取复制映射配置
    \param[out] config: 配置结构体指针
    \param[out] none
    \retval     none
*/
void dmx512_led_controller_get_replicated_config(dmx512_led_config_t *config);

#endif /* DMX512_LED_CONTROLLER_H */